package jp.co.cos.ittrick.channel.controller.channel;

import java.util.List;

import jp.co.cos.ittrick.channel.Constants;
import jp.co.cos.ittrick.channel.model.ApplicationModel;
import jp.co.cos.ittrick.channel.model.CategoryModel;
import jp.co.cos.ittrick.channel.model.ChannelModel;
import jp.co.cos.ittrick.channel.model.ChapterModel;
import jp.co.cos.ittrick.channel.model.PageModel;
import jp.co.cos.ittrick.channel.model.PreModel;
import jp.co.cos.ittrick.channel.service.ApplicationService;
import jp.co.cos.ittrick.channel.service.CategoryService;
import jp.co.cos.ittrick.channel.service.ChannelService;
import jp.co.cos.ittrick.channel.service.ChapterService;
import jp.co.cos.ittrick.channel.service.PageService;
import jp.co.cos.ittrick.channel.service.PreService;
import jp.co.cos.ittrick.channel.util.Utility;

import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;

import com.google.appengine.api.datastore.Text;

public class PageController extends Controller {

    private ApplicationService applicationService;
    private PageService pageService;
    private PreService preService;
    private ChannelService channelService;
    private ChapterService chapterService;
    private CategoryService categoryService;

    private ApplicationModel applicationModel;
    private ChapterModel chapterModel;
    private ChannelModel channelModel;
    private PageModel pageModel;

    public PageController() {
        applicationService = new ApplicationService();
        chapterService = new ChapterService();
        pageService = new PageService();
        preService = new PreService();
        channelService = new ChannelService();
        categoryService = new CategoryService();
    }

    @Override
    public Navigation run() throws Exception {

        String page = asString("page");

        applicationModel = applicationService.getApplicationModel();
        requestScope("applicationModel", applicationModel);

        try {
            pageModel = pageService.getPageByKey(Integer.valueOf(page));
        }catch(Exception e) {
            return forward("/exception/exception404");
        }

        if(pageModel == null) {
            return forward("/exception/exception404");
        }

        // chapterModel の取得
        chapterModel =chapterService.getChapterByKey((int)pageModel.getChapterModelRef().getKey().getId());
        requestScope("chapterModel", chapterModel);

        // channelModel の取得
        CategoryModel categoryModel = categoryService.getCategoryByKey((int)chapterModel.getCategoryModelRef().getKey().getId());
        channelModel = channelService.getChannelByKey(categoryModel.getChannelModelRef().getKey().getName());
        requestScope("channelModel", channelModel);

        // preの挿入とImageタグの置き換え
        changePre();
        changeImage();

        requestScope("pageModel", pageModel);

        String thisPageUrl = "http://" + applicationModel.getApplicationId() + ".appspot.com/" + channelModel.getKeyString() + "/c" + chapterModel.getKeyString() + "/page" + pageModel.getKeyString() + ".html";
        requestScope("thisPageUrl", thisPageUrl);

        // new 記事
        List<PageModel> newPageList = pageService.getPageListOfLimit(0, Constants.PAGE_ARTICLE_LIST_LIMIT);
        requestScope("newPageList", newPageList);

        // チャンネルリスト
        List<ChannelModel> channelList = channelService.getAll();
        requestScope("channelList", channelList);


        // スマートフォンの場合
        if(Utility.isSmartPhone(request)) {
            return forward("/sp/channel/page.jsp");
        }

        return forward("page.jsp");
    }

    /**
     * <pre>
     * プログラムのソース（Pre）をソース内の特殊タグ「@xxxxxx@」に置き換える
     * xxxxはpreのキーです。
     * </pre>
     * @param pageModel
     */
    private void changePre() {

        StringBuffer contentNew = new StringBuffer("");
        String contentOld = pageModel.getContentString();

        String[] spList = contentOld.split("@@");
        for(String tmp: spList) {

            // すべてを対象に数字に変換する。
            // ID以外の部分はエラーになるので無視する
            try {
                Integer preId = Integer.valueOf(tmp);

                PreModel model = preService.getPreByKey(preId);

                // preを挿入する
                if(model != null) {
                    contentNew.append(model.getName());
                    contentNew.append("<pre class=\"prettyprint\"><code>");
                    contentNew.append(model.getContentString());
                    contentNew.append("</code></pre>");

                    // 数字であるが、該当preModelが存在しない場合は、
                    // そのまんま挿入
                }else {
                    contentNew.append(tmp);
                }

                // エラーになった場合はpreId以外のコンテンツであるため、
                // そのまんま挿入
            }catch (Exception e) {
                contentNew.append(tmp);
            }

        }

        pageModel.setContent(new Text(contentNew.toString()));

    }


    private void changeImage() {

        StringBuffer contentNew = new StringBuffer("");
        String contentOld = pageModel.getContentString();

        String[] spList = contentOld.split("##");
        for(String tmp: spList) {

            // すべてを対象に数字に変換する。
            // ID以外の部分はエラーになるので無視する
            try {

                String imageName = "";
                String imagePass = "";

                String[] splitName = tmp.split("\\.");
                if(splitName.length == 2) {
                    if(splitName[1].equals("jpg") || splitName[1].equals("png") || splitName[1].equals("gif")) {
                        imageName = tmp;

                        imagePass = Constants.IMAGE_PATH_BASE_URL +
                        applicationModel.getApplicationId() +
                        "/images/" +
                        channelModel.getKeyString() +
                        "/" +
                        chapterModel.getKeyString() +
                        "/" +
                        pageModel.getKeyString() +
                        "/" +
                        imageName;

                    }
                }

                // preを挿入する
                if(!imagePass.equals("")) {
                    contentNew.append("<img src=\"" + imagePass + "\"/>");

                    // 数字であるが、該当preModelが存在しない場合は、
                    // そのまんま挿入
                }else {
                    contentNew.append(tmp);
                }

                // エラーになった場合はpreId以外のコンテンツであるため、
                // そのまんま挿入
            }catch (Exception e) {
                contentNew.append(tmp);
            }

        }

        pageModel.setContent(new Text(contentNew.toString()));

    }
}
